home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / src / sys.ipp < prev    next >
Encoding:
Modula Implementation  |  1993-12-23  |  5.9 KB  |  242 lines

  1. IMPLEMENTATION MODULE sys;
  2. __IMP_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* Basiert auf der MiNTLIB von Eric R. Smith und anderen                     *)
  14. (* --------------------------------------------------------------------------*)
  15. (* 08-Dez-93, Holger Kleinschmidt                                            *)
  16. (*****************************************************************************)
  17.  
  18. VAL_INTRINSIC
  19. CAST_IMPORT
  20.  
  21. FROM SYSTEM IMPORT
  22. (* TYPE *) ADDRESS,
  23. (* PROC *) ADR;
  24.  
  25. FROM PORTAB IMPORT
  26. (* TYPE *) UNSIGNEDWORD, SIGNEDLONG;
  27.  
  28. FROM MEMBLK IMPORT
  29. (* PROC *) memalloc, memdealloc;
  30.  
  31. FROM ctype IMPORT
  32. (* PROC *) todigit;
  33.  
  34. FROM types IMPORT
  35. (* CONST*) ClkTck,
  36. (* TYPE *) timeCast, StrPtr, StrRange, PathName, sizeT, timeT;
  37.  
  38. FROM OSCALLS IMPORT
  39. (* PROC *) Dpathconf, Sysconf, Tgettime, Tgetdate;
  40.  
  41. IMPORT e;
  42.  
  43. FROM pSTRING IMPORT
  44. (* PROC *) SLEN;
  45.  
  46. FROM DosSystem IMPORT
  47. (* TYPE *) CPUType, MachineType, OsPtr, OsHeader,
  48. (* PROC *) CPU, Machine, GetOsHeader, MiNTVersion;
  49.  
  50. FROM DosSupport IMPORT
  51. (* CONST*) DINCR,
  52. (* PROC *) UnixToDos;
  53.  
  54. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  55.  
  56. CONST
  57.   EOKL = LIC(0);
  58.  
  59. VAR
  60.   uts  : UtsnameRec;
  61.   MiNT : CARDINAL;
  62.  
  63. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  64.  
  65. PROCEDURE uname ((* --/AUS *) VAR name : UtsnameRec ): INTEGER;
  66. BEGIN
  67.  name := uts;
  68.  RETURN(0);
  69. END uname;
  70.  
  71. (*---------------------------------------------------------------------------*)
  72.  
  73. PROCEDURE pathconf ((* EIN/ -- *) REF file  : ARRAY OF CHAR;
  74.                     (* EIN/ -- *)     which : PConfVal      ): SIGNEDLONG;
  75.  
  76. VAR dot   : BOOLEAN;
  77.     done  : BOOLEAN;
  78.     limit : SIGNEDLONG;
  79.     stack : ADDRESS;
  80.     msize : CARDINAL;
  81.     path0 : StrPtr;
  82.  
  83. BEGIN
  84.  IF MiNT > 0 THEN
  85.    msize := SLEN(file) + DINCR;
  86.    memalloc(VAL(sizeT,msize), stack, path0);
  87.    UnixToDos(file, msize - DINCR, VAL(StrRange,msize), path0, dot, done);
  88.    IF NOT done THEN
  89.      memdealloc(stack);
  90.      RETURN(-1);
  91.    END;
  92.    CASE which OF
  93.      pcMaxCanon : limit := -1; (* ?? *)
  94.     |pcMaxInput : limit := -1; (* ?? *)
  95.     |pcChownRestricted: limit := 0; (* ja *)
  96.     |pcVdisable : limit := 0;
  97.    ELSE
  98.      IF NOT Dpathconf(path0, INT(which)+1, limit) THEN
  99.        e.errno := INT(limit);
  100.        limit   := -1;
  101.      ELSIF which = pcNoTrunc THEN
  102.        IF limit > LIC(0) THEN
  103.          limit := -1; (* <=> Dateinamen werden gekuerzt *)
  104.        ELSE
  105.          limit := 0;
  106.        END;
  107.      END;
  108.    END;
  109.    memdealloc(stack);
  110.    RETURN(limit);
  111.  ELSE (* NOT MiNT *)
  112.    CASE which OF
  113.      pcLinkMax  : RETURN(1);
  114.     |pcPathMax  : RETURN(128);
  115.     |pcNameMax  : RETURN(12);
  116.     |pcNoTrunc  : RETURN(-1); (* -1 <=> es wird gekuerzt *)
  117.     |pcVdisable : RETURN(0);
  118.     |pcMaxInput : RETURN(-1); (* ? *)
  119.     |pcMaxCanon : RETURN(-1); (* ? *)
  120.    ELSE (* pcPipeBuf, pcChownRestricted... *)
  121.      e.errno := e.EINVAL;
  122.      RETURN(-1);
  123.    END;
  124.  END;
  125. END pathconf;
  126.  
  127. (*---------------------------------------------------------------------------*)
  128.  
  129. PROCEDURE sysconf ((* EIN/ -- *) which : SConfVal ): SIGNEDLONG;
  130.  
  131. VAR limit : SIGNEDLONG;
  132.  
  133. BEGIN
  134.  IF which = scVersion THEN
  135.    e.errno := e.EINVAL;
  136.    RETURN(-1);
  137.  END;
  138.  IF MiNT > 0 THEN
  139.    CASE which OF
  140.      scArgMax     : RETURN(UNLIMITED); (* wegen "ARGV" *)
  141.     |scClkTck     : RETURN(ClkTck);
  142.     |scJobControl : RETURN(1);  (* ja *)
  143.     |scSavedIds   : RETURN(-1); (* nein ?? *)
  144.    ELSE
  145.      IF Sysconf(INT(which)+1, limit) THEN
  146.        RETURN(limit);
  147.      ELSE
  148.        e.errno := INT(limit);
  149.        RETURN(-1);
  150.      END;
  151.    END;
  152.  ELSE
  153.    CASE which OF
  154.      scArgMax     : RETURN(UNLIMITED); (* wegen "ARGV" *)
  155.     |scOpenMax    : RETURN(81);        (* max. Kennung = 80 *)
  156.     |scNGroupsMax : RETURN(0);
  157.     |scChildMax   : RETURN(UNLIMITED);
  158.     |scClkTck     : RETURN(ClkTck);
  159.     |scJobControl : RETURN(-1); (* kein ``Job Control'' *)
  160.     |scSavedIds   : RETURN(-1); (* aber kein Fehler ! *)
  161.    ELSE
  162.      e.errno := e.EINVAL;
  163.      RETURN(-1);
  164.    END;
  165.  END;
  166. END sysconf;
  167.  
  168. (*---------------------------------------------------------------------------*)
  169.  
  170. PROCEDURE time ((* -- /AUS *) VAR time : timeT );
  171. VAR tc : timeCast;
  172. BEGIN
  173.  tc.time := Tgettime();
  174.  tc.date := Tgetdate();
  175.  time    := tc.cmp;
  176. END time;
  177.  
  178. (*---------------------------------------------------------------------------*)
  179.  
  180. PROCEDURE putvers (vers : CARDINAL; VAR str : ARRAY OF CHAR );
  181.  
  182. VAR __REG__ i  : UNSIGNEDWORD;
  183.     __REG__ j  : UNSIGNEDWORD;
  184.     __REG__ hi : CARDINAL;
  185.     __REG__ lo : CARDINAL;
  186.             s  : ARRAY [0..9] OF CHAR;
  187.  
  188. BEGIN
  189.  hi := vers DIV 256;
  190.  lo := vers MOD 256;
  191.  i  := 0;
  192.  REPEAT
  193.    s[i] := todigit(lo MOD 10);
  194.    lo   := lo DIV 10;
  195.    INC(i);
  196.  UNTIL lo = 0;
  197.  IF i = 1 THEN
  198.    s[i] := '0'; INC(i);
  199.  END;
  200.  s[i] := '.'; INC(i);
  201.  REPEAT
  202.    s[i] := todigit(hi MOD 10);
  203.    hi   := hi DIV 10;
  204.    INC(i);
  205.  UNTIL hi = 0;
  206.  j := 0;
  207.  WHILE i > 0 DO
  208.    DEC(i);
  209.    str[j] := s[i];
  210.    INC(j);
  211.  END;
  212.  str[j] := 0C;
  213. END putvers;
  214.  
  215. (*===========================================================================*)
  216.  
  217. VAR hi, lo : CARDINAL;
  218.     osP    : OsPtr;
  219.  
  220. BEGIN
  221.  MiNT := MiNTVersion();
  222.  WITH uts DO
  223.    nodename := "";
  224.    IF MiNT > 0 THEN
  225.      sysname := "MiNT";
  226.      putvers(MiNT, release);
  227.    ELSE
  228.      sysname := "TOS";
  229.      release := "0.00";
  230.    END;
  231.    GetOsHeader(osP);
  232.    putvers(VAL(CARDINAL,osP^.osVersion), version);
  233.    CASE Machine() OF
  234.      atariST  : machine := "atarist";
  235.     |atariSTE : machine := "atariste";
  236.     |atariTT  : machine := "ataritt";
  237.    ELSE
  238.                 machine := "atari";
  239.    END;
  240.  END; (* WITH *)
  241. END sys.
  242.